package com.github.xtranslation.core.util;

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;

import static io.vavr.API.*;
import static io.vavr.Predicates.instanceOf;

/**
 * CollectionUtils: 集合工具类，提供一些集合操作的工具方法。
 *
 * @author zhangxiaoxiang
 * @since 2025/7/27
 */
public class CollectionUtils {
    /**
     * 将对象转换为List集合
     * <p>
     * 此方法可以处理多种类型的输入：
     * <ul>
     *   <li>null - 返回空列表</li>
     *   <li>Collection - 返回包含集合所有元素的新列表</li>
     *   <li>Iterable - 返回包含可迭代对象所有元素的新列表</li>
     *   <li>数组 - 返回包含数组所有元素的新列表</li>
     *   <li>其他对象 - 返回只包含该对象的单元素列表</li>
     * </ul>
     * <p>
     * 示例用法:
     * <pre>{@code
     * // null 输入
     * List<Object> result1 = CollectionUtils.objToList(null);
     * // result1 为空列表 []
     *
     * // Collection 输入
     * List<String> list = Arrays.asList("a", "b", "c");
     * List<Object> result2 = CollectionUtils.objToList(list);
     * // result2 为 ["a", "b", "c"]
     *
     * // 数组输入
     * String[] array = {"x", "y", "z"};
     * List<Object> result3 = CollectionUtils.objToList(array);
     * // result3 为 ["x", "y", "z"]
     *
     * // 单个对象输入
     * List<Object> result4 = CollectionUtils.objToList("hello");
     * // result4 为 ["hello"]
     * }</pre>
     *
     * @param obj 任意对象
     * @return List集合，包含转换后的元素
     */
    public static List<Object> objToList(Object obj) {
        return Match(obj).of(
                Case($(Objects::isNull), Collections.emptyList()),
                Case($(instanceOf(Collection.class)), c -> new ArrayList<>((Collection<?>) c)),
                Case($(instanceOf(Iterable.class)), i -> StreamSupport.stream(((Iterable<?>) i).spliterator(), false).collect(Collectors.toList())),
                Case($(o -> o.getClass().isArray()), arr -> Arrays.stream((Object[]) arr).collect(Collectors.toList())),
                Case($(), Collections::singletonList)
        );
    }

}
